home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 19 / CU Amiga Magazine's Super CD-ROM 19 (1998)(EMAP Images)(GB)[!][issue 1998-02].iso / CUCD / Programming / LEDA / source / src / graph / _graph.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-16  |  4.7 KB  |  239 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  _graph.c
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15.  
  16. #include <LEDA/graph.h>
  17.  
  18. // constructors, destructor, operator=, ...
  19.  
  20. graph::graph() 
  21. { max_n_index = -1;
  22.   max_e_index = -1; 
  23.   parent = 0; 
  24.   undirected = false;
  25.  }
  26.  
  27.  
  28. graph& graph::operator=(const graph& G)
  29. { node v,w;
  30.   edge e,e1;
  31.  
  32.   if (&G == this) return *this;
  33.  
  34.   node* node_vec = new node[G.max_n_index+1];
  35.  
  36.   edge* edge_vec = new edge[G.max_e_index+1];
  37.  
  38.   clear();
  39.  
  40.   forall_nodes(v,G) 
  41.     node_vec[v->name] = new_node(v->data[0]);
  42.                              
  43.   forall_edges(e,G) 
  44.    { v = node_vec[e->s->name];
  45.      w = node_vec[e->t->name];
  46.      edge_vec[e->name] = e1 = new edge_struct(v,w,e->data[0]);
  47.      E.append(edge_link(e1));
  48.      e1->name = ++max_e_index;
  49.     }
  50.  
  51.   forall_nodes(v,G) 
  52.   { node v1 = node_vec[v->name];
  53.     forall_out_edges(e,v)
  54.        v1->adj_edges[0].append(adj_link1(edge_vec[e->name]));
  55.     forall_in_edges(e,v)
  56.        v1->adj_edges[1].append(adj_link2(edge_vec[e->name]));
  57.    }
  58.  
  59.   forall_nodes(v,*this) init_adj_iterator(v); 
  60.  
  61.   parent = G.parent;
  62.   undirected = G.undirected;
  63.  
  64.   delete node_vec;
  65.   delete edge_vec;
  66.  
  67.   return *this;
  68. }
  69.  
  70.  
  71. void graph::copy_all_entries() const
  72. { node v;
  73.   forall_nodes(v,*this) copy_node_entry(v->data[0]);
  74.   edge e;
  75.   forall_edges(e,*this) copy_edge_entry(e->data[0]);
  76. }
  77.  
  78. void graph::clear_all_entries() const
  79. { node v;
  80.   forall_nodes(v,*this) clear_node_entry(v->data[0]);
  81.   edge e;
  82.   forall_edges(e,*this) clear_edge_entry(e->data[0]);
  83. }
  84.  
  85.  
  86. graph::graph(const graph& G)  
  87. { node v,w;
  88.   edge e,e1;
  89.   node* node_vec = new node[G.max_n_index+1];
  90.   edge* edge_vec = new edge[G.max_e_index+1];
  91.  
  92.  
  93.   max_n_index = max_e_index = -1;
  94.  
  95.   forall_nodes(v,G) 
  96.     node_vec[v->name] = new_node(v->data[0]);
  97.                              
  98.   forall_edges(e,G) 
  99.    { v = node_vec[e->s->name];
  100.      w = node_vec[e->t->name];
  101.      edge_vec[e->name] = e1 = new edge_struct(v,w,e->data[0]);
  102.      E.append(edge_link(e1));
  103.      e1->name = ++max_e_index;
  104.     }
  105.  
  106.  
  107.   forall_nodes(v,G) 
  108.   { node v1 = node_vec[v->name];
  109.     forall_out_edges(e,v)
  110.        v1->adj_edges[0].append(adj_link1(edge_vec[e->name]));
  111.     forall_in_edges(e,v)
  112.        v1->adj_edges[1].append(adj_link2(edge_vec[e->name]));
  113.    }
  114.  
  115.  
  116.   forall_nodes(v,*this) init_adj_iterator(v); 
  117.  
  118.   parent = G.parent;
  119.   undirected = G.undirected;
  120.  
  121.   delete node_vec;
  122.   delete edge_vec;
  123.  
  124. }
  125.  
  126.  
  127. // subgraph constructors  (do not work for undirected graphs)
  128.  
  129. graph::graph(graph& G, const list<node>& nl, const list<edge>& el)
  130. { // construct subgraph (nl,el) of graph G
  131.  
  132.   parent = &G;
  133.   node v,w;
  134.   edge e;
  135.  
  136.   node* N = new node[G.max_n_index+1];
  137.  
  138.   forall(v,nl)
  139.    { if (graph_of(v) != parent) 
  140.       error_handler(1,"graph: illegal node in subgraph constructor");
  141.      N[v->name] = new_node((GenPtr)v);
  142.     }
  143.  
  144.   forall(e,el)
  145.    { v = source(e);
  146.      w = target(e);
  147.      if ( graph_of(e)!= parent || N[v->name]==0 || N[w->name]==0 ) 
  148.       error_handler(1,"graph: illegal edge in subgraph constructor");
  149.      new_edge(N[v->name],N[w->name],(GenPtr)e);
  150.     }
  151.  
  152.   undirected = G.undirected;
  153.  
  154.   delete N;
  155.  
  156.  }
  157.  
  158. graph::graph(graph& G, const list<edge>& el)
  159. { /* construct subgraph of graph G with edge set el  */
  160.  
  161.   node  v,w;
  162.   edge  e;
  163.   node* N = new node[G.max_n_index+1];
  164.  
  165.   forall_nodes(v,G) N[v->name] = 0;
  166.  
  167.   parent = &G;
  168.  
  169.   forall(e,el)
  170.    { v = source(e);
  171.      w = target(e);
  172.      if (N[v->name] == 0) N[v->name] = new_node((GenPtr)v);
  173.      if (N[w->name] == 0) N[w->name] = new_node((GenPtr)w);
  174.      if ( graph_of(e) != parent )
  175.       error_handler(1,"graph: illegal edge in subgraph constructor");
  176.      new_edge(N[v->name],N[w->name],(GenPtr)e);
  177.     }
  178.  
  179.   undirected = G.undirected;
  180.  
  181.   delete N;
  182.  
  183.  }
  184.  
  185.  
  186. // destructor
  187.  
  188. void graph::clear()
  189.   while ( ! E.empty() ) 
  190.     delete edge(edge_link(E.pop()));
  191.  
  192.   while ( ! V.empty() ) 
  193.   { node v = node(node_link(V.pop()));
  194.     v->adj_edges[0].clear();
  195.     v->adj_edges[1].clear();
  196.     delete v;
  197.    }
  198.  
  199.   max_n_index = max_e_index = -1;
  200. }
  201.  
  202. list<node> graph::all_nodes() const
  203. { list<node> result;
  204.   node v;
  205.   forall_nodes(v,*this) result.append(v);
  206.   return result;
  207. }
  208.  
  209. list<edge> graph::all_edges() const
  210. { list<edge> result;
  211.   edge e;
  212.   forall_edges(e,*this) result.append(e);
  213.   return result;
  214. }
  215.  
  216. list<edge> graph::adj_edges(node v) const
  217. { list<edge> result;
  218.   edge e;
  219.   forall_adj_edges(e,v) result.append(e);
  220.   return result;
  221. }
  222.  
  223.  
  224. list<node> graph::adj_nodes(node v) const
  225. { list<node> result;
  226.   edge e;
  227.   forall_adj_edges(e,v) result.append(target(e));
  228.   return result;
  229. }
  230.  
  231.  
  232.  
  233. void init_node_data(const graph& G,int i, GenPtr x)
  234. { node v;
  235.   forall_nodes(v,G) v->data[i] = x;
  236.  }
  237.